import * as XLSX from 'xlsx'
import { ElMessage } from 'element-plus'

/**
 * 将科学计数法转换为完整数字字符串
 */
function convertScientificNotationToString(value: any): string {
  if (!value) return ''
  
  const str = String(value).trim()
  
  // 如果是科学计数法格式（如 1.10101E+17）
  if (str.includes('E+') || str.includes('e+')) {
    try {
      // 将科学计数法转换为数字，然后转为字符串
      const num = Number(str)
      if (!isNaN(num)) {
        // 确保是整数，去掉小数点
        return Math.floor(num).toString()
      }
    } catch (e) {
      console.warn('科学计数法转换失败:', str, e)
    }
  }
  
  // 如果包含小数点，尝试转换为整数
  if (str.includes('.')) {
    try {
      const num = Number(str)
      if (!isNaN(num)) {
        return Math.floor(num).toString()
      }
    } catch (e) {
      console.warn('小数转换失败:', str, e)
    }
  }
  
  return str
}

/**
 * 导出数据到Excel (前端生成)
 */
export function exportToExcel<T extends Record<string, any>>(
  data: T[],
  columns: { key: keyof T; label: string }[],
  filename: string = '导出数据.xlsx'
) {
  try {
    // 转换数据格式
    const exportData = data.map(item => {
      const row: Record<string, any> = {}
      columns.forEach(col => {
        row[col.label] = item[col.key]
      })
      return row
    })
    
    // 创建工作表
    const ws = XLSX.utils.json_to_sheet(exportData)
    
    // 创建工作簿
    const wb = XLSX.utils.book_new()
    XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
    
    // 导出文件
    XLSX.writeFile(wb, filename)
    
    ElMessage.success('导出成功')
  } catch (error) {
    console.error('导出Excel失败:', error)
    ElMessage.error('导出失败')
  }
}

/**
 * 下载Excel文件 (从后端获取的blob)
 */
export function downloadExcelFile(blob: Blob, filename: string = '导出数据.xlsx') {
  try {
    // 验证blob
    if (!blob || blob.size === 0) {
      throw new Error('文件内容为空')
    }
    
    // 检查blob类型
    const validTypes = [
      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx
      'application/vnd.ms-excel', // .xls
      'application/octet-stream' // 通用二进制类型
    ]
    
    if (!validTypes.includes(blob.type) && blob.type !== '') {
      console.warn(`警告: 文件类型可能不正确: ${blob.type}`)
    }
    
    // 确保文件名以.xlsx结尾
    if (!filename.toLowerCase().endsWith('.xlsx')) {
      filename = filename.replace(/\.[^/.]+$/, '') + '.xlsx'
    }
    
    // 创建下载链接
    const url = window.URL.createObjectURL(blob)
    const link = document.createElement('a')
    link.href = url
    link.download = filename
    link.style.display = 'none'
    
    // 添加到页面并触发下载
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    
    // 清理URL
    window.URL.revokeObjectURL(url)
    
    ElMessage.success('导出成功')
  } catch (error) {
    console.error('下载Excel文件失败:', error)
    ElMessage.error('导出失败: ' + (error as Error).message)
  }
}

/**
 * 从blob响应中获取文件名
 */
export function getFilenameFromBlob(_blob: Blob, defaultName: string = '导出数据.xlsx'): string {
  // 尝试从Content-Disposition头中获取文件名
  // 这里我们使用默认文件名，因为浏览器通常会自动处理
  return defaultName
}

/**
 * 从Excel文件读取数据
 */
export function readExcelFile<T = any>(file: File): Promise<T[]> {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    
    reader.onload = (e) => {
      try {
        const data = e.target?.result
        const workbook = XLSX.read(data, { type: 'binary' })
        
        // 读取第一个工作表
        const firstSheetName = workbook.SheetNames[0]
        const worksheet = workbook.Sheets[firstSheetName]
        
        // 转换为JSON，使用header选项确保第一行作为标题
        const jsonData = XLSX.utils.sheet_to_json<T>(worksheet, {
          header: 1, // 使用数组格式
          defval: '', // 空单元格的默认值
          raw: false // 不保持原始格式，获取格式化后的值
        })
        
        console.log('原始Excel数据:', jsonData)
        
        // 如果有数据，将第一行作为标题，转换为对象数组
        if (jsonData.length > 1) {
          const headers = jsonData[0] as string[]
          const rows = jsonData.slice(1) as any[][]
          
          console.log('Excel标题行:', headers)
          console.log('Excel数据行:', rows)
          
          const result = rows.map((row, index) => {
            const obj: any = {}
            headers.forEach((header, colIndex) => {
              if (header) {
                let value = row[colIndex] || ''
                
                // 处理身份证号字段 - 修复科学计数法问题
                const trimmedHeader = header.trim()
                if (trimmedHeader === '身份证号' || trimmedHeader === 'idCard') {
                  value = convertScientificNotationToString(value)
                }
                
                // 处理学号字段 - 确保是字符串格式
                if (trimmedHeader === '学号' || trimmedHeader === 'studentId') {
                  value = convertScientificNotationToString(value)
                }
                
                // 处理联系电话字段
                if (trimmedHeader === '联系电话' || trimmedHeader === 'phone') {
                  value = convertScientificNotationToString(value)
                }
                
                obj[trimmedHeader] = value
              }
            })
            console.log(`第${index + 2}行转换结果:`, obj)
            return obj
          })
          
          console.log('最终转换结果:', result)
          resolve(result as T[])
        } else {
          resolve([])
        }
      } catch (error) {
        console.error('解析Excel文件失败:', error)
        reject(error)
      }
    }
    
    reader.onerror = () => {
      reject(new Error('读取文件失败'))
    }
    
    reader.readAsBinaryString(file)
  })
}

/**
 * 验证Excel数据
 */
export function validateExcelData<T extends Record<string, any>>(
  data: T[],
  requiredFields: (keyof T)[]
): { valid: boolean; errors: string[] } {
  const errors: string[] = []
  
  if (!data || data.length === 0) {
    errors.push('Excel文件为空')
    return { valid: false, errors }
  }
  
  data.forEach((row, index) => {
    requiredFields.forEach(field => {
      if (!row[field] && row[field] !== 0) {
        errors.push(`第 ${index + 2} 行缺少必填字段: ${String(field)}`)
      }
    })
    
    // 验证学号格式 - 更灵活的验证
    if (row['学号']) {
      const studentId = String(row['学号']).trim()
      if (!/^\d{6,15}$/.test(studentId)) {
        errors.push(`第 ${index + 2} 行学号格式不正确，应为6-15位数字`)
      }
    }
    
    // 验证身份证号格式
    if (row['身份证号']) {
      const idCard = String(row['身份证号']).trim()
      if (!/^\d{17}[\dXx]$/.test(idCard)) {
        errors.push(`第 ${index + 2} 行身份证号格式不正确，应为18位（最后一位可为X）`)
      }
    }
    
    // 验证手机号格式 - 更宽松的验证
    if (row['联系电话']) {
      const phone = String(row['联系电话']).trim()
      if (!/^1[3-9]\d{9}$/.test(phone) && !/^0\d{2,3}-?\d{7,8}$/.test(phone)) {
        errors.push(`第 ${index + 2} 行联系电话格式不正确，应为手机号或固定电话`)
      }
    }
    
    // 验证邮箱格式
    if (row['邮箱'] && row['邮箱'].toString().trim()) {
      const email = String(row['邮箱']).trim()
      if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
        errors.push(`第 ${index + 2} 行邮箱格式不正确`)
      }
    }
    
    // 验证性别 - 支持更多格式
    if (row['性别']) {
      const gender = String(row['性别']).trim()
      const validGenders = ['男', '女', 'male', 'female', 'Male', 'Female', 'M', 'F', 'm', 'f']
      if (!validGenders.includes(gender)) {
        errors.push(`第 ${index + 2} 行性别格式不正确，应为"男"或"女"`)
      }
    }
    
    // 验证年级 - 更宽松的验证
    if (row['年级']) {
      const grade = Number(row['年级'])
      if (isNaN(grade) || grade < 1900 || grade > 2100) {
        errors.push(`第 ${index + 2} 行年级格式不正确，应为1900-2100之间的数字`)
      }
    }
  })
  
  return {
    valid: errors.length === 0,
    errors
  }
}

/**
 * 生成导入模板数据
 */
export function generateImportTemplate(): any[] {
  return [
    {
      '学号': '2024001',
      '姓名': '张三',
      '性别': '男',
      '出生日期': '2005-03-15',
      '身份证号': '110101200503150001',
      '专业': '计算机科学与技术',
      '班级': '计科2024-1班',
      '年级': 2024,
      '入学日期': '2024-09-01',
      '联系电话': '13800138001',
      '邮箱': 'zhangsan@example.com',
      '地址': '北京市朝阳区'
    },
    {
      '学号': '2024002',
      '姓名': '李四',
      '性别': '女',
      '出生日期': '2005-04-20',
      '身份证号': '110101200504200002',
      '专业': '软件工程',
      '班级': '软工2024-1班',
      '年级': 2024,
      '入学日期': '2024-09-01',
      '联系电话': '13800138002',
      '邮箱': 'lisi@example.com',
      '地址': '上海市浦东新区'
    }
  ]
}

/**
 * 下载导入模板
 */
export function downloadImportTemplate() {
  try {
    const templateData = generateImportTemplate()
    const columns = [
      { key: '学号', label: '学号' },
      { key: '姓名', label: '姓名' },
      { key: '性别', label: '性别' },
      { key: '出生日期', label: '出生日期' },
      { key: '身份证号', label: '身份证号' },
      { key: '专业', label: '专业' },
      { key: '班级', label: '班级' },
      { key: '年级', label: '年级' },
      { key: '入学日期', label: '入学日期' },
      { key: '联系电话', label: '联系电话' },
      { key: '邮箱', label: '邮箱' },
      { key: '地址', label: '地址' }
    ]
    
    exportToExcel(templateData, columns, '学生信息导入模板.xlsx')
    ElMessage.success('模板下载成功')
  } catch (error) {
    console.error('下载模板失败:', error)
    ElMessage.error('下载模板失败')
  }
}

/**
 * 预览Excel数据
 */
export function previewExcelData<T extends Record<string, any>>(
  data: T[],
  maxRows: number = 10
): { preview: T[]; total: number } {
  return {
    preview: data.slice(0, maxRows),
    total: data.length
  }
}

